package br.requisiteworks.modelo;

import java.util.Date;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.validation.constraints.NotNull;

import org.springframework.format.annotation.DateTimeFormat;

import br.requisiteworks.util.Entidade;
import br.requisiteworks.util.validacao.Nome;
import br.requisiteworks.util.validacao.Texto;

/**
 * Projeto onde serao anexados os requisitos do sistema
 * 
 * @author Mikhail Domanoski
 * 
 * @version 2, 05/05/2010
 */
@Entity
@Table(name = "tbl_projeto")
public class Projeto extends Entidade {

	/**
	 * Numero do projeto no banco de dados
	 */
	@Id
	@GeneratedValue(strategy = GenerationType.AUTO)
	@Column(name = "num_proje")
	private int numero;

	/**
	 * Nome do projeto
	 */
	@Column(name = "nom_proje")
	@Nome
	private String nome;

	/**
	 * Data em que o projeto se iniciou
	 */
	@Column(name = "dat_inici")
	@DateTimeFormat(pattern = "dd/MM/yyyy")
	@Temporal(TemporalType.DATE)
	@NotNull
	private Date inicio;

	/**
	 * Data em que o projeto teve seu termino
	 */
	@Column(name = "dat_termi", nullable = true)
	@DateTimeFormat(pattern = "dd/MM/yyyy")
	@Temporal(TemporalType.DATE)
	private Date termino;

	/**
	 * Data estimada para o termino do projeto
	 */
	@Column(name = "dat_termi_previ")
	@DateTimeFormat(pattern = "dd/MM/yyyy")
	@Temporal(TemporalType.DATE)
	@NotNull(message = "")
	private Date terminoEstimado;

	/**
	 * Descricao geral do projeto
	 */
	@Column(name = "tex_descr")
	@Texto
	private String descricao;

	/**
	 * Status do Projeto
	 */
	@Column(name = "num_status")
	@Enumerated(EnumType.ORDINAL)
	private Status status = Status.Planejamento;

	/**
	 * Cliente que solicitou o projeto
	 */
	@ManyToOne
	@JoinColumn(name = "num_clien")
	@NotNull
	private Cliente cliente;

	/**
	 * Time que executara o projeto
	 */
	@ManyToOne
	@JoinColumn(name = "num_time")
	@NotNull
	private Time time;

	@Column(name = "ind_notificacao", nullable = false)
	private boolean notificacao = false;

	public int getNumero() {
		return numero;
	}

	public void setNumero(int numero) {
		this.numero = numero;
	}

	public String getNome() {
		return nome;
	}

	public void setNome(String nome) {
		this.nome = nome;
	}

	public Date getInicio() {
		return inicio;
	}

	public void setInicio(Date inicio) {
		this.inicio = inicio;
	}

	public Date getTermino() {
		return termino == null ? terminoEstimado : termino;
	}

	public void setTermino(Date termino) {
		this.termino = termino;
	}

	public Date getTerminoEstimado() {
		return terminoEstimado;
	}

	public void setTerminoEstimado(Date terminoEstimado) {
		this.terminoEstimado = terminoEstimado;
	}

	public String getDescricao() {
		return descricao;
	}

	public void setDescricao(String descricao) {
		this.descricao = descricao;
	}

	public Cliente getCliente() {
		return cliente;
	}

	public void setCliente(Cliente cliente) {
		this.cliente = cliente;
	}

	public Time getTime() {
		return time;
	}

	public void setTime(Time time) {
		this.time = time;
	}

	public void setStatus(Status statusProjeto) {
		this.status = statusProjeto;
	}

	public Status getStatus() {
		return status;
	}

	public enum Status {
		Planejamento, Iniciado, EmAndamento, Finalizado, Cancelado, Suspenso;
		public int getNumber() {
			return ordinal();
		}
	}

	@Override
	public String toString() {
		return "Projeto [numero=" + numero + ", nome=" + nome + ", cliente="
				+ cliente.getNomeFantasia() + "]";
	}

	@Override
	public boolean equals(Object obj) {
		if (obj == this)
			return true;
		if (obj == null)
			return true;
		try {
			Projeto other = (Projeto) obj;
			return other.numero == this.numero;
		} catch (ClassCastException e) {
			return false;
		}
	}

	@Override
	public int hashCode() {
		int result = 0;
		result += 31 * this.nome.hashCode();
		return result;
	}

	public void setNotificacao(boolean notificacao) {
		this.notificacao = notificacao;
	}

	public boolean isNotificacao() {
		return notificacao;
	}

}
